#include "user_include.h"



#if 1
void udp_task(void)
{
	
}
#else
#define TCP_CLIENT_RX_BUFSIZE 1000
#define REMOTE_PORT 8087
#define LWIP_SEND_DATA 0X80
struct netconn *tcp_clientconn;                                                 // TCP CLIENT网络连接结构体
u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE];                                   // TCP客户端接收数据缓冲区
u8 tcp_client_sendbuf[] = "Apollo STM32F4/F7 NETCONN TCP Client send data\r\n"; // TCP客户端发送数据缓冲区
u8 tcp_client_flag;                                                             // TCP客户端数据发送标志位

void udp_task(void)
{

    u32 data_len = 0;
    struct pbuf *q;
    err_t err, recv_err;
    static ip_addr_t server_ipaddr, loca_ipaddr;
    static u16_t server_port, loca_port;

    server_port = REMOTE_PORT;
    // IP4_ADDR(&server_ipaddr, lwipdev.remoteip[0], lwipdev.remoteip[1], lwipdev.remoteip[2], lwipdev.remoteip[3]);
    IP4_ADDR(&server_ipaddr, 192, 168, 3, 254);
    while (0)
    {
        tcp_clientconn = netconn_new(NETCONN_TCP);                          //创建一个TCP链接
        err = netconn_connect(tcp_clientconn, &server_ipaddr, server_port); //连接服务器
        if (err != ERR_OK)
            netconn_delete(tcp_clientconn); //返回值不等于ERR_OK,删除tcp_clientconn连接
        else if (err == ERR_OK)             //处理新连接的数据
        {
            struct netbuf *recvbuf;
            //tcp_clientconn->recv_timeout = 10;
            netconn_getaddr(tcp_clientconn, &loca_ipaddr, &loca_port, 1); //获取本地IP主机IP地址和端口号
            //printf("连接上服务器%d.%d.%d.%d,本机端口号为:%d\r\n", lwipdev.remoteip[0], lwipdev.remoteip[1], lwipdev.remoteip[2], lwipdev.remoteip[3], loca_port);
            while (1)
            {
                osDelay(10);
                if ((recv_err = netconn_recv(tcp_clientconn, &recvbuf)) == ERR_OK) //接收到数据
                {
                    taskENTER_CRITICAL();                                 //关中断
                    memset(tcp_client_recvbuf, 0, TCP_CLIENT_RX_BUFSIZE); //数据接收缓冲区清零
                    for (q = recvbuf->p; q != NULL; q = q->next)          //遍历完整个pbuf链表
                    {
                        //判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间，如果大于
                        //的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据，否则的话就拷贝所有的数据
                        if (q->len > (TCP_CLIENT_RX_BUFSIZE - data_len))
                            memcpy(tcp_client_recvbuf + data_len, q->payload, (TCP_CLIENT_RX_BUFSIZE - data_len)); //拷贝数据
                        else
                            memcpy(tcp_client_recvbuf + data_len, q->payload, q->len);
                        data_len += q->len;
                        if (data_len > TCP_CLIENT_RX_BUFSIZE)
                            break; //超出TCP客户端接收数组,跳出
                    }
                    err = netconn_write(tcp_clientconn, tcp_client_recvbuf, strlen((char *)tcp_client_recvbuf), NETCONN_COPY); //将接收的数据发送出去
                    if (err != ERR_OK)
                    {
                        printf("发送失败\r\n");
                    }
                    taskEXIT_CRITICAL();

                    data_len = 0; //复制完成后data_len要清零。
                    printf("%s\r\n", tcp_client_recvbuf);
                    netbuf_delete(recvbuf);
                }
                else if (recv_err == ERR_CLSD) //关闭连接
                {
                    netconn_close(tcp_clientconn);
                    netconn_delete(tcp_clientconn);
                    break;
                }
            }
        }
    }
}
#endif
